package ledger

import (
	"jlpay-sdk-go/pkg/jlpay/core"
	"jlpay-sdk-go/pkg/jlpay/models"
)

// ==================== 账单申请URL ====================

// BillApplyUrlRequest 账单申请URL请求
type BillApplyUrlRequest struct {
	models.OrgBaseRequest
	// OrgCode 机构代码
	OrgCode string `json:"org_code,omitempty"`
	// BillDate 账单日期
	BillDate string `json:"bill_date,omitempty"`
	// 原始请求映射数据
	rawRequestMap map[string]interface{} `json:"-"`
}

// NewBillApplyUrlRequest 创建账单申请URL请求
func NewBillApplyUrlRequest() *BillApplyUrlRequest {
	req := &BillApplyUrlRequest{}
	return req
}

// SetOrgCode 设置机构代码
func (r *BillApplyUrlRequest) SetOrgCode(orgCode string) *BillApplyUrlRequest {
	r.OrgCode = orgCode
	return r
}

// SetBillDate 设置账单日期
func (r *BillApplyUrlRequest) SetBillDate(billDate string) *BillApplyUrlRequest {
	r.BillDate = billDate
	return r
}

// SetRawRequestMap 设置原始请求映射数据
func (r *BillApplyUrlRequest) SetRawRequestMap(rawMap map[string]interface{}) *BillApplyUrlRequest {
	r.rawRequestMap = rawMap
	return r
}

// GetRawMap 获取原始请求映射数据
func (r *BillApplyUrlRequest) GetRawMap() (map[string]interface{}, bool) {
	return r.rawRequestMap, len(r.rawRequestMap) > 0
}

// ToMap 转换为map
func (r *BillApplyUrlRequest) ToMap() (map[string]interface{}, error) {
	// 如果有原始请求数据，优先使用
	if rawMap, hasRaw := r.GetRawMap(); hasRaw {
		return rawMap, nil
	}

	// 先获取基类的map
	baseMap, err := r.OrgBaseRequest.ToMap()
	if err != nil {
		return nil, err
	}

	// 添加自己的字段
	if r.OrgCode != "" {
		baseMap["org_code"] = r.OrgCode
	}
	if r.BillDate != "" {
		baseMap["bill_date"] = r.BillDate
	}

	return baseMap, nil
}

// CheckRequiredParams 检查必需参数
func (r *BillApplyUrlRequest) CheckRequiredParams(config *core.Config) error {
	// 与Python版本保持一致，不进行参数校验
	return nil
}

// BillApplyUrlResponse 账单申请URL响应
type BillApplyUrlResponse struct {
	models.StandardResponse
	// OrgCode 机构代码
	OrgCode string `json:"org_code,omitempty"`
	// DownloadURL 下载URL
	DownloadURL string `json:"download_url,omitempty"`
}

// NewBillApplyUrlResponse 创建账单申请URL响应
func NewBillApplyUrlResponse() *BillApplyUrlResponse {
	return &BillApplyUrlResponse{}
}
